package com.wlz.helloworld;

import com.rabbitmq.client.*;
import com.wlz.utils.RabbitUtils;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;

/**
 *  点对点(简单)的队列 模式   -- 接收者
 * @author wlz
 * @date 2022-06-27  8:50 下午
 */
@Slf4j
public class Consumer {

    public static void main(String[] args) throws Exception{

        // 获取 tcp 长连接
        Connection connection = RabbitUtils.getConnection();

        // 创建通信"通道"， 相当于tcp 中的虚拟连接
        Channel channel = connection.createChannel();

        String queueName = "hello_wlz";
        //创建队列,声明并创建一个队列，如果队列已存在，则使用这个队列
        //第一个参数：队列名称ID
        //第二个参数：是否持久化，false对应不持久化数据，MQ停掉数据就会丢失
        //第三个参数：是否队列私有化，false则代表所有消费者都可以访问，true代表只有第一次拥有它的消费者才能一直使用，其他消费者不让访问
        //第四个：是否自动删除,false代表连接停掉后不自动删除掉这个队列
        //其他额外的参数, null
        channel.queueDeclare(queueName, false, false, false, null);

        //从MQ服务器中获取数据

        //创建一个消息消费者
        //第一个参数：队列名
        //第二个参数代表是否自动确认收到消息，false代表手动编程来确认消息，这是MQ的推荐做法
        //第三个参数要传入DefaultConsumer的实现类
        channel.basicConsume(queueName, false, new Reciver(channel));

    }
}


@Slf4j
class Reciver extends DefaultConsumer {

    private Channel channel;

    public Reciver(Channel channel) {
        super(channel);
        this.channel = channel;
    }

    @Override
    public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {

        String message = new String(body);

        log.info("消费者接收到的消息: {} ", message);

        log.info("消息的tagId: {} ", envelope.getDeliveryTag());

        // 1. 消息的 tagId
        // 2. false只确认签收当前的消息，设置为true的时候则代表签收该消费者所有未签收的消息
        channel.basicAck(envelope.getDeliveryTag(), false);
    }
}